import { tween, Vec3 } from "cc";

export class Util {

    static getSafeData<T>(value: T, defaultValue: T) {
        if (value !== null && value !== undefined) {
            return value;
        } else {
            return defaultValue;
        }
    }

        static clamp(value: number, min: number, max: number): number {
        return Math.min(Math.max(value, min), max);
    }
    // 保留整数
    static roundToInt(num: number): number {
        return Math.round(num);
    }

        // 保留1位小数的辅助函数
    static roundToOne(num: number): number {
        return Math.round(num * 10) / 10;
    }
        // 保留1位小数的辅助函数
    static roundToTwo(num: number): number {
        return Math.round(num * 100) / 100;
    }

    // 保留1位小数的辅助函数
    static roundToThree(num: number): number {
        return Math.round(num * 1000) / 1000;
    }

    static getObjectValues<T>(obj: { [key: string]: T }): T[] {
        return Object.keys(obj).map(key => obj[key]);
    }

    static readonly ELEMENT_ADVANTAGE_MAP: Record<string, string> = {
        '金': '木', // 金克木
        '木': '土', // 木克土
        '土': '水', // 土克水
        '水': '火', // 水克火
        '火': '金'  // 火克金
    };


    static tweenBigSmall(node, f){
        tween(node)
            .to(0.1, { scale: new Vec3(1.2, 1.2, 1) }) // 放大
            .to(0.1, { scale: new Vec3(0.8, 0.8, 1) }) // 缩小
            .to(0.1, { scale: new Vec3(1, 1, 1) })     // 恢复原状
            .call(f())
            .start();

    }

    // 生成随机ID的方法
    static generateRandomId(length: number = 10): string {
        
        const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
        let result = '';
        for (let i = 0; i < length; i++) {
            const randomIndex = Math.floor(Math.random() * characters.length);
            result += characters[randomIndex];
        }
        return result;
    }


/**
 * 从字符串末尾提取数字
 * @param str 要处理的字符串
 * @returns 返回从字符串末尾提取的数字，如果没有找到数字则返回0
 */
    static extractNumberFromEnd(str: string): number {
    // 使用正则表达式匹配字符串末尾的一个或多个数字
        const match = str.match(/(\d+)$/);
    // 如果找到匹配项，则将匹配到的数字字符串转换为整数返回，否则返回0
        return match ? parseInt(match[1], 10) : 0;
    }



    /**
     * 将毫秒数转换为可读的时分秒格式
     * @param milliseconds 毫秒数
     * @returns 格式化的时间字符串 (HH:MM:SS 或 MM:SS)
     */
    static formatTime(milliseconds: number): string {
        // 处理负数情况
        if (milliseconds < 0) {
            return "00:00:00";
        }
        
        // 转换为秒数
        const totalSeconds = Math.floor(milliseconds / 1000);
        
        // 计算小时、分钟、秒
        const hours = Math.floor(totalSeconds / 3600);
        const minutes = Math.floor((totalSeconds % 3600) / 60);
        const seconds = totalSeconds % 60;
        
        // 传统补零方法
        const formatNumber = (num: number): string => {
            return num < 10 ? '0' + num : num.toString();
        };
        
        // 如果有小时，显示 HH:MM:SS，否则显示 MM:SS
        if (hours > 0) {
            return `${formatNumber(hours)}:${formatNumber(minutes)}:${formatNumber(seconds)}`;
        } else {
            return `${formatNumber(minutes)}:${formatNumber(seconds)}`;
        }
    }

/**
     * 获取当前时辰字符串
     * @param hour 0-23 的小时数
     */
    static getShichen(hour: number): string {
        // 子时是 23:00 - 01:00，跨天了，所以特殊处理
        if (hour >= 23 || hour < 1) return "子时";
        if (hour >= 1 && hour < 3) return "丑时";
        if (hour >= 3 && hour < 5) return "寅时";
        if (hour >= 5 && hour < 7) return "卯时";
        if (hour >= 7 && hour < 9) return "辰时";
        if (hour >= 9 && hour < 11) return "巳时";
        if (hour >= 11 && hour < 13) return "午时";
        if (hour >= 13 && hour < 15) return "未时";
        if (hour >= 15 && hour < 17) return "申时";
        if (hour >= 17 && hour < 19) return "酉时";
        if (hour >= 19 && hour < 21) return "戌时";
        if (hour >= 21 && hour < 23) return "亥时";
        return "未知";
    }
    
    /**
     * 获取当前时辰的描述（用于增加风味，可选）
     */
    static getShichenDesc(hour: number): string {
        const shichen = this.getShichen(hour);
        const map = {
            "子时": "夜半", "丑时": "鸡鸣", "寅时": "平旦", 
            "卯时": "日出", "辰时": "食时", "巳时": "隅中",
            "午时": "日中", "未时": "日昳", "申时": "晡时", 
            "酉时": "日入", "戌时": "黄昏", "亥时": "人定"
        };
        return map[shichen] || "";
    }

}





import { SpriteFrame } from "cc";

const INDEX_REG = /\((\d+)\)/;

const getNumberWithinString = (str: string) => parseInt(str.match(INDEX_REG)?.[1] || "0");

export const sortSpriteFrame = (spriteFrame: Array<SpriteFrame>) =>
  spriteFrame.sort((a, b) => getNumberWithinString(a.name) - getNumberWithinString(b.name));

export const rad2Angle = (red: number) => (red * 180) / Math.PI;

